//Event1:@key, Event2: key, Event3: key 
//0.1bPʂŌvABinF1hTotalPressDur
#include "hspext.as"	//tH_Ip̃Cu
ScreenWidth=1280
ScreenHeight=480
PathUY=50
LogUY=70
dim UsedKey,8
UsedKey(0)=1	//reft
UsedKey(1)=8	//down
UsedKey(2)=4	//right
UsedKey(3)=2	//up
UsedKey(4)=16384	//A
UsedKey(5)=131072	//S
UsedKey(6)=65536	//D
UsedKey(7)=32768	//W
PreHundMsec=0
CurrHundMsec=0
ElapsedSec=0.000000001	//HSP̎덷΍
TimeFrame=0	//100msɑĂ
RealElapsedSec=0.0
NextBinTime=0.0
dim now_sec,8	//1100~b()
dim pre_sec,8	//1100~b(1^[O)
ddim TotalPressDur,8	//1100~bAv
ddim PreTotalPressDur,8	//Oɕ\lێiJE^[j
ddim hTotalPressDur,8	//\lێpiJE^[j
dim Trg,8
dim PreTrg,8
dim TotalPressNum,8
dim PreTotalPressNum,8
Screen 0,ScreenWidth,ScreenHeight,0,10,10
gsel 0
title "Bin timer (Mr. behavior)"
BinResult=""
TimeSeriesRes=""
OutputText=""
SerialNum=0
FPS=0
NextFPSCheck=1.0
CurrFPS=0
PlaySpd=1.0
BinSec=60
HundMsecElapsed=0
Pause=-1
StartTrg=0
sdim PathAndName,1000

/*
exist "PlaySpd.bt"
if strsize!=-1{
	bload "PlaySpd.bt",PlaySpd
}
exist "BinSec.bt"
if strsize!=-1{
	bload "BinSec.bt",BinSec
}*/

ShiftX=0
ShiftY=25
//pos ShiftX,ShiftY
//mes "Name:"
//ShiftX+=45
//pos ShiftX,ShiftY
//input Name,150
//ShiftX+=175

pos ShiftX,ShiftY
mes "PlaySpd:"
ShiftX+=70
pos ShiftX,ShiftY
input PlaySpd,65
ShiftX+=75
pos ShiftX,ShiftY
mes "Bin(s):"
ShiftX+=60
pos ShiftX,ShiftY
input BinSec,25

objsize 100
ShiftX+=65
pos ShiftX,ShiftY
//button gosub "Folder",*Folder
//ShiftX+=105
pos ShiftX,ShiftY
button gosub "Start",*Start
ShiftX+=105
pos ShiftX,ShiftY
button gosub "Pause/Resume",*PauseResume
ShiftX+=105
pos ShiftX,ShiftY
button gosub "Save (.csv)",*Save
ShiftX+=105
pos ShiftX,ShiftY
button gosub "Reset",*Reset

ddim PressDurBin,8,864000
dim PressNumBin,8,864000
dim TimeSeries,8,864000	//0.1bɃ{^ۂێi1͉ƂӖj
CurrBin=0
text=""


onexit goto *exit

repeat	//Main loop
	//stick st,1263	//15
	stick st,247023
	
	if Phase=0{	//ŏ̉܂ł̃[vőҋ@
		if st=16{
			gosub *Start
		}
	}

	//FPSZo
	CurrFPS++
	ResultChange=0
	HundMsecElapsed=0	//hundred mili sec
	CurrHundMsec=gettime(7)/100	//100~b擾
	if PreHundMsec!=CurrHundMsec{	////100~bオĂ0.1bo߂ƌȂ
		if Phase=1 and Pause=-1{
			ElapsedSec+=0.1*PlaySpd
			TimeFrame+=1
			HundMsecElapsed=1
		}
		RealElapsedSec+=0.1
		ResultChange=1
		PreHundMsec=CurrHundMsec
		if RealElapsedSec >= NextFPSCheck{
			FPS=CurrFPS
			CurrFPS=0
			NextFPSCheck+=1.0
		}
	}
	
	//{^̓͏ԃ`FbN
	repeat 8
		//PreTrg(cnt)=Trg(cnt)
		if st=UsedKey(cnt){	//Ăꍇ
			ResultChange=1
			if Trg(cnt)=0{	//n߂̏ꍇ
				Trg(cnt)=1
				if cnt=0{
					color 255,0,0
					text = "Left key pressed"
				}
				if cnt=1{
					color 0,200,0
					text = "Down key pressed"
				}
				if cnt=2{
					color 200,200,0
					text = "Right key pressed"
				}
				if cnt=3{
					color 0,0,255
					text = "Up key pressed"
				}
				if cnt=4{
					color 255,127,39
					text = "A key pressed"
				}
				if cnt=5{
					color 128,64,64
					text = "S key pressed"
				}
				if cnt=6{
					color 155,200,205
					text = "D key pressed"
				}
				if cnt=7{
					color 201,81,205
					text = "W key pressed"
				}
				boxf 3,3,903,20
				pos 4,2
				color 255,255,255
				mes text
				color 0,0,0
				if Phase=1 and Pause=-1{
					TotalPressNum(cnt)++
				}
			}
			if Phase=1{		//͒
				if Pause=-1{	//|[Ył͂Ȃ
					if HundMsecElapsed=1{
						TotalPressDur(cnt)+=0.1*PlaySpd	//0.1b
						TimeSeries(cnt,TimeFrame)=1
					}
				}
			}
		}
		if st!=UsedKey(cnt) & Trg(Cnt)=1{	//Iu
			Trg(Cnt)=0
			color 255,255,255
			boxf 3,3,903,20
			color 0,0,0
		}
		if Phase=1{
			if Pause=-1{
				hTotalPressDur(cnt)=TotalPressDur(cnt)
			}
		}
	loop

	//lɕύX^Cg̐lXV
	if ResultChange=1{
		if Pause=1: PauseText=" [Pause]"
		if Pause=-1: PauseText=""
		title ""+strf("%.2f",ElapsedSec)+"s    "+"[Left]"+strf("%.2f",hTotalPressDur(0))+"s ("+TotalPressNum(0)+")"+" [Down]"+strf("%.2f",hTotalPressDur(1))+"s ("+TotalPressNum(1)+")"+" [Right]"+strf("%.2f",hTotalPressDur(2))+"s ("+TotalPressNum(2)+")"+" [Up]"+strf("%.2f",hTotalPressDur(3))+"s ("+TotalPressNum(3)+")"    +" [A]"+strf("%.2f",hTotalPressDur(4))+"s ("+TotalPressNum(4)+")"+" [S]"+strf("%.2f",hTotalPressDur(5))+"s ("+TotalPressNum(5)+")"+" [D]"+strf("%.2f",hTotalPressDur(6))+"s ("+TotalPressNum(6)+")"+" [W]"+strf("%.2f",hTotalPressDur(7))+"s ("+TotalPressNum(7)+")  FPS:"+FPS+"  "+PauseText
	}

	//BinԂo߂烉bvL
	if Phase!=0 and Pause=-1{
		if ElapsedSec >= NextBinTime{		
			Repeat 8
				PressDurBin(cnt,CurrBin) = TotalPressDur(cnt)-PreTotalPressDur(cnt)	//1BinZo
				PressNumBin(cnt,CurrBin) = TotalPressNum(cnt)-PreTotalPressNum(cnt)	//1BinZo
			loop
			pos 0,CurrBin*20+80
			mes ""+str(CurrBin+1)+" [Left]"+strf("%.2f",PressDurBin(0,CurrBin))+"s "+PressNumBin(0,CurrBin)+"times"+"  [Down]"+strf("%.2f",PressDurBin(1,CurrBin))+"s "+PressNumBin(1,CurrBin)+"times"+"  [Right]"+strf("%.2f",PressDurBin(2,CurrBin))+"s "+PressNumBin(2,CurrBin)+"times"+"  [Up]"+strf("%.2f",PressDurBin(3,CurrBin))+"s "+PressNumBin(3,CurrBin)+"times"    +"  [A]"+strf("%.2f",PressDurBin(4,CurrBin))+"s "+PressNumBin(4,CurrBin)+"times"+"  [S]"+strf("%.2f",PressDurBin(5,CurrBin))+"s "+PressNumBin(5,CurrBin)+"times"+"  [D]"+strf("%.2f",PressDurBin(6,CurrBin))+"s "+PressNumBin(6,CurrBin)+"times"+"  [W]"+strf("%.2f",PressDurBin(7,CurrBin))+"s "+PressNumBin(7,CurrBin)+"times"
			
			Repeat 8
				PreTotalPressDur(cnt)=TotalPressDur(cnt)
				PreTotalPressNum(cnt)=TotalPressNum(cnt)
			Loop
			NextBinTime += double(BinSec)
			CurrBin++
		}
	}
	
	await 12
	
	
loop

*OpenSaveDialog
	// Simple save dialog
	dialog "csv", 17, "Save results as CSV"
	//if stat = 0 : stop  // User clicked cancel
	
	// Get the selected filename
	if stat!=0{
		sdim FolderPath, 256
		PathAndName=getpath(refstr,1)
	}
	return
	
*Start
	gosub *Reset
	StartHour=gettime(4)
	StartMin=gettime(5)
	StartSec=gettime(6)
	ElapsedSec=0.000000001	//HSP̎덷΍
	TimeFrame=0
	NextBinTime=0.0
	NextBinTime+=double(BinSec)
	CurrBin=0
	pos 0,LogUY
	Phase=1
	Pause=-1
	objenable 0,0	//rŒlςȂ悤͗s
	objenable 1,0
	objenable 2,0
	//objenable 4,0
	return

	
*PauseResume
	Pause*=-1
	return


*Reset
	Phase=0
	Pause=-1
	StartTrg=0
	BinResult=""
	OutputTimeSeries=""
	//PreHundMsec=0
	//CurrFPS=0
	ElapsedSec=0.0
	TimeFrame=0
	//RealElapsedSec=0.0
	NextBinTime=0.0
	dim now_sec,8	//1100~b()
	dim pre_sec,8	//1100~b(1^[O)
	ddim TotalPressDur,8	//1100~bAv
	ddim PreTotalPressDur,8	//Oɕ\lێiJE^[j
	ddim hTotalPressDur,8	//\lێpiJE^[j
	dim Trg,8
	dim PreTrg,8
	dim TotalPressNum,8
	dim PreTotalPressNum,8

	ddim PressDurBin,8,864000
	dim PressNumBin,8,864000
	dim TimeSeries,8,864000	//0.1bɃ{^ۂێi1͉ƂӖj
	CurrBin=0
	text=""

	objenable 0,1	//rŒlςȂ悤͗s
	objenable 1,1
	objenable 2,1
	objenable 3,1
	color 255,255,255
	boxf 0,LogUY,ScreenWidth,ScreenHeight
	color 0,0,0
	title ""+strf("%.2f",ElapsedSec)+"s    "+"[Left]"+strf("%.2f",hTotalPressDur(0))+"s ("+TotalPressNum(0)+")"+" [Down]"+strf("%.2f",hTotalPressDur(1))+"s ("+TotalPressNum(1)+")"+" [Right]"+strf("%.2f",hTotalPressDur(2))+"s ("+TotalPressNum(2)+")"+" [Up]"+strf("%.2f",hTotalPressDur(3))+"s ("+TotalPressNum(3)+")"    +" [Tab]"+strf("%.2f",hTotalPressDur(4))+"s ("+TotalPressNum(4)+")"+" [Ctrl]"+strf("%.2f",hTotalPressDur(5))+"s ("+TotalPressNum(5)+")"+" [Enter]"+strf("%.2f",hTotalPressDur(6))+"s ("+TotalPressNum(6)+")  FPS:"+FPS
	return


*Save
	gosub *OpenSaveDialog
	//FolderPath="C:\\Users\\otsuk\\Downloads"
	if stat!=0{
		notesel BinResult
		noteadd "BinNo.,Left(s),Left(#),Down(s),Down(#),Right(s),Right(#),Up(s),Up(#),A(s),A(#),S(s),S(#),D(s),D(#),W(s),W(#)"
		
		Repeat 864000
			gyou = str(cnt+1)+","+PressDurBin(0,cnt)+","+PressNumBin(0,cnt)+","+PressDurBin(1,cnt)+","+PressNumBin(1,cnt)+","+PressDurBin(2,cnt)+","+PressNumBin(2,cnt)+","+PressDurBin(3,cnt)+","+PressNumBin(3,cnt)+","+PressDurBin(4,cnt)+","+PressNumBin(4,cnt)+","+PressDurBin(5,cnt)+","+PressNumBin(5,cnt)+","+PressDurBin(6,cnt)+","+PressNumBin(6,cnt)+","+PressDurBin(7,cnt)+","+PressNumBin(7,cnt)
			noteadd gyou
			if cnt=CurrBin-1{
				break
			}
		Loop
		
		notesave PathAndName+"_Binned.csv"
	
		
	
	
		notesel OutputTimeSeries
		noteadd "msec,Left,Down,Right,Up,A,S,D,W"
		
		repeat 864000
			ocnt=cnt
			gyou=""+str(double(ocnt)/10)+","
			repeat 8
				gyou += str(TimeSeries(cnt,ocnt))
				if cnt=7{
					break
				}
				gyou+=","
			loop
			noteadd gyou
			
			if ocnt >= int(ElapsedSec*10.0)-1{	//Ō̍sɍs
				break
			}
		loop
		notesave PathAndName+"_TimeSeries.csv"
	}
	
	return

	
*exit
	//bsave "PlaySpd.bt",PlaySpd
	//bsave "BinSec.bt",BinSec
	end